/*
 * servidor.h
 *
 *  Created on: 03/10/2011
 *      Author: guido
 */

#ifndef SERVIDOR_H_
#define SERVIDOR_H_

#include "socket-servidor.h"
#include "sistema-usuarios.h"
#include <fstream>
#include <list>
#include "thread.h"
#include "threader.h"
#include "runnable.h"

class MetodoAceptarConexion;
class MetodoReceiveSend;

class Servidor {
private:
	bool seguirAceptando;
	SocketServidor socket;
	SistemaUsuarios usuarios;
	std::list<Socket*> clientes;
	Threader threader;
	std::fstream archivoClientes;
public:
	Servidor(unsigned short int puerto, char* rutaClientes);
	~Servidor();
	int start();
	void shutdown();
	friend class MetodoAceptarConexion;
	friend class MetodoReceiveSend;
	void aceptarConexion();

private:
	int endianOpuesto(int i);
	std::string recibirString(Socket* socket);
};

class MetodoAceptarConexion: public Runnable {
public:
	MetodoAceptarConexion(Servidor* servidor) {
		this->servidor = servidor;
	}
	~MetodoAceptarConexion() {
	}
	void run();
private:
	Servidor* servidor;
};

class MetodoReceiveSend: public Runnable {
public:
	MetodoReceiveSend(Servidor* servidor, Socket* socket) {
		this->servidor = servidor;
		this->socket = socket;
	}
	~MetodoReceiveSend() {
	}
	void run();
private:
	Servidor* servidor;
	Socket* socket;
};

#endif /* SERVIDOR_H_ */
